package com.itheima.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.google.common.collect.Lists;
import com.itheima.dao.OrderSettingMapper;
import com.itheima.pojo.OrderSetting;
import com.itheima.service.OrderSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @version V1.0
 * @author: yongjichu
 * @date: 2020/1/15 19:12
 * @description:
 */
@Service(interfaceClass = OrderSettingService.class)
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {
    @Autowired
    private OrderSettingMapper orderSettingMapper;
    @Override
    public void setNumberByDate(OrderSetting orderSetting) {
        //首先根据日期查询数据库里有没有这个数据，如果有的话就是更新，如果没有的话就是新增
        Long count= orderSettingMapper.findCountByOrderData(orderSetting.getOrderDate());
        //如果数据大于零说明已经有这个日期，则对数据进行更新
        if(count>0){
            orderSettingMapper.setNumberByDate(orderSetting);
        }else{
            //走这里说明数据库中没有这个日期，则对数据进行新增的操作
            orderSettingMapper.addOrderSetting(orderSetting);
        }

    }

    /**
     * 批量导入数据
     * @param listOrderSetting
     */
    @Override
    public void batchSave(List<OrderSetting> listOrderSetting) {
       /* for (OrderSetting orderSetting : listOrderSetting) {
            //首先根据日期查询数据库里有没有这个数据，如果有的话就是更新，如果没有的话就是新增
            Long count= orderSettingMapper.findCountByOrderData(orderSetting.getOrderDate());
            //如果数据大于零说明已经有这个日期，则对数据进行更新
            if(count>0){
                orderSettingMapper.setNumberByDate(orderSetting);
            }else{
                //走这里说明数据库中没有这个日期，则对数据进行新增的操作
                orderSettingMapper.addOrderSetting(orderSetting);
            }
        }*/
       //如果使用循环的方式就是用以上这种，但是我们现在使多线程，因为数据比较多，线程池里线程对象不能盲目设置，要根据自己的电脑核数，还有根据io密集还有cpu密集
        //首先我们对数据进行拆分，这样才能让每个线程分担一部分数据，这里我们使用谷歌提供的工具，不过要导入一个jar包，已经在health-common中引入
        List<List<OrderSetting>> partition = Lists.partition(listOrderSetting, 10);
        //使用多线程导入
        ExecutorService pool = Executors.newFixedThreadPool(5);
       // ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1));
       //遍历拆分出来的数据
        for (List<OrderSetting> settings : partition) {
            //使用线程提交数据
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    for (OrderSetting setting : settings) {
                        //调用setNumberByDate向数据库中提交数据
                        setNumberByDate(setting);
                    }
                }
            });

        }
    }

    /**
     * 获取预约设置数据
     * @param date
     * @return
     */
    @Override
    public List<Map> getOrderSettingByMonth(String date) {
        /**
         * 现在date的形式是这种2020-01，我们要把数据进行拆分
         * 给它拼接成这种形式传到dao层  2020-01-01，2020-01-31
         *返回的数据类型一定要是这种形式：  {"date":22,"month":0,"number":300,"reservations":300,},
         */
        String dateBegin=date+"-01";
        String dateEnd=date+"-31";
        List<Map> result=new ArrayList<>();
        List<OrderSetting> orderSettingList=orderSettingMapper.getOrderSettingByMonth(dateBegin,dateEnd);
        //开始拆分数据
        if(CollectionUtil.isNotEmpty(orderSettingList)){
            /**
             * 因为我们要这种格式的数据{"date":22,"month":0,"number":300,"reservations":300,}
             * number和reservations就是从数据库返回的，但是date和month就要从OrderSetting对象中获取啦，OrderSetting对象中有方法
             */
            for (OrderSetting orderSetting : orderSettingList) {
               Map map=new HashMap();
                Date orderDate = orderSetting.getOrderDate();
                //向maop中添加date数据
                map.put("date",orderDate.getDate());
                //向maop中添加month数据
                map.put("month",orderDate.getMonth());
                //向maop中添加number数据
                map.put("number",orderSetting.getNumber());
                //向maop中添加reservations数据
                map.put("reservations",orderSetting.getReservations());
                result.add(map);
            }
        }
        return result;
    }
}
